<?php

// /得是linux系统才能用  ！！！

// http://www.doc88.com/p-0781675597771.html
//生成几个子进程抢资源，用semapher做保护
$process_num = 3;
print "老爸：我是老爸，我要生{$process_num}个小孩。\n";
$children = array();
$source_id = ftok('processAsync.php', 'w');
$sem = sem_get($source_id, 1); //取得一个semaphore，可以申请的只有一个
$i = 1;
while($i <= $process_num) {
	$pid = pcntl_fork (); // 生出一个子程序
	if ($pid == - 1) { // 要是 $pid 是 -1 那就是出错了
		exit ( 1 ); // 离开，并且报告出错
	} else if ($pid != 0) { // 若$pid不是0的话，那就是父进程
		print "老爸：生了一个第{$i}個孩子，pid是{$pid}\n";
		$children [] = $pid;
	} else { // 子程序拿到的 $pid 是 0
		break; // 直接跳出
	}
$i++;
}
if($pid) {
$status = null;
print "老爸：老爸会等大家玩好才离开\n";
foreach($children as $pid) { //要等每個孩子都离开才离开
pcntl_waitpid($pid, $status);
print "老爸：pid是{$pid}的那个孩子，回去时他告诉我他的状況是{$status}\n";
}
print '老爸也要走了'."\n";
} else {
for($j=1;$j<3;$j++){
sem_acquire($sem);//向编号为$sem信号量申请进入临界区
print "我是第{$i}个小朋友，我是第{$j}次进入了临界区，我要玩{$j}秒\n";
sleep($i);
print "我是第{$i}个小朋友，要离开临界区了\n";
sem_release($sem);//释放编号为$sem的信号量
}
print "我是第{$i}个小朋友，要走了\n";
}